package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.entity.*;
import com.itheima.reggie.mapper.OrdersMapper;
import com.itheima.reggie.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author ：sean
 * @date ：Created in 2022/5/23
 * @description ：订单业务实现类
 * @version: 1.0
 */
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrdersMapper, Orders>
	implements OrderService {

	@Autowired
	private ShoppingCartService cartService;

	@Autowired
	private AddressBookService bookService;

	@Autowired
	private UserService userService;

	@Autowired
	private OrderDetailService orderDetailService;

	@Transactional
	@Override
	public void submit(Orders orders) {
		// 完成下订单的所有业务
		// 数据校验
		// 1.购物车无数据，不能下订单,用哪个业务对象
		Long userId = BaseContext.getCurrentId();
		LambdaQueryWrapper<ShoppingCart> cartLambdaQueryWrapper
			= new LambdaQueryWrapper<>();
		cartLambdaQueryWrapper.eq(ShoppingCart::getUserId,userId);
		// 获取购物车列表
		List<ShoppingCart> shoppingCartsList = cartService.list(cartLambdaQueryWrapper);
		if(shoppingCartsList == null || shoppingCartsList.size() == 0){
			throw new CustomException("购物车无数据，不能下订单");
		}
		// 2. 如果没收货地址，不能下订单,用哪个业务对象
		// 根据主键查询
		AddressBook addressBook = bookService.getById(orders.getAddressBookId());
		if(addressBook == null){
			throw  new CustomException("没收货地址，不能下订单");
		}
		// 如果可以下订单，能想到那些？订单的数据在哪来
		// 订单要总价值，订单的数据来自购物车列表
		// 3.遍历当前用户的购物车(ShoppingCart)，
		// 计算总价值，并购物车数据转为订单详情(OrderDetail)
		AtomicInteger totalAmount = new AtomicInteger();
		// 程序产生一个唯一订单号。
		Long orderId = IdWorker.getId();
		List<OrderDetail> orderDetailsList = new ArrayList<>();
		for (ShoppingCart cart:shoppingCartsList){
			// 一条购物车数，就是一条详情
			OrderDetail orderDetail = new OrderDetail();
			BeanUtils.copyProperties(cart,orderDetail);
			// orderDetail缺少什么，订单详情属于一个订单
			orderDetail.setOrderId(orderId);
			// 价值，是当前这条记录的价值 BigDecimal类型
			BigDecimal amount = orderDetail.getAmount();
			BigDecimal subResult = amount.multiply(new BigDecimal(orderDetail.getNumber()));
			// 累计总价值
			totalAmount.addAndGet(subResult.intValue());

			orderDetailsList.add(orderDetail);
		}
		log.info("[订单-详情列表],orderDetailsList:{}",orderDetailsList);
		log.info("[订单-总价值]orderId:{},totalAmount:{}",
			orderId,
			totalAmount.intValue());
		// 4.构建订单对象，orders,缺什么补什么
		orders.setId(orderId);
		// 订单的字符串变化，有规则 XXXXXXXX-XX-XX-XX
		orders.setNumber(orderId+"");
		orders.setOrderTime(LocalDateTime.now());
		orders.setCheckoutTime(LocalDateTime.now());
		orders.setAmount(new BigDecimal(totalAmount.get()));
		orders.setUserId(userId);
		orders.setStatus(1);
		// 订单的相关数据都初始化完成
		// 从产品确定，这个username，是下订单人的名字，还是收货人名字
		// 如果的下订单人的名字，从哪里获取？
		User currUser = userService.getById(userId);
		orders.setUserName(currUser.getName());
		// 设置收获信息,从哪里获取？前面已经获取了addressBook
		orders.setPhone(addressBook.getPhone());
		orders.setConsignee(addressBook.getConsignee());
		// 简单处理 省市区详细拼起来。
		orders.setAddress(addressBook.getDetail());
		// 最终保存订单数据
		this.save(orders);
		// 最终保存订单详情,批量保存订单详情
		orderDetailService.saveBatch(orderDetailsList);
		// 如果订单OK，当前用户的购物车数据，是否还需要？
		// 清空购物车，查询条件，用户ID
		cartService.remove(cartLambdaQueryWrapper);
	}
}
